package baduga.server;


public class Player_Deck {
	
	/** punkty gracza*/
	int points =  -1,
	/** Ilość identycznościowych kart */
	    idCards = 4;
	
	/** ilośc kart */
	int size = 4;
	
	/** Identyfikator Kart gracza, 4-y*/
	Integer pCards[];
	
	
	
	
	
	
	/**
	 * 
	 * Funkcja zajmuje się obliczaniem pkt. za karty
	 * 
	 */
	public void calcPoints()
	{
		
		//Def.
		Integer tmpCardsID[];
		
		int tmpInt[], 
			tmpVal[], 
			diff,
			tPoints, /** Punkty */
			tIdCards; /** Liczba identycznościowych kart*/
		
		Serwer srv;
		
		//Inicjalizacja
		tmpCardsID = pCards.clone();
		srv = Controler.getcSerwer();
		
		tPoints = -1;
		tIdCards = size;
		
		
		
		for(int i = 0; i < size; i++)
		{
			if(tmpCardsID[ i ] == null)
				continue;
			
			tPoints = srv.getCard( tmpCardsID[ i ] ).getFigure();
			
			
			for(int j = i; j < size; j++)
			{
				if(tmpCardsID[ j ] == null)
					continue;
				
				
				//Sprawdzamy czy karty są takie same
				tmpInt = srv.getCard( tmpCardsID[ i ] ).compareTo( srv.getCard( tmpCardsID[ j ] ) );
				
				//Jeżeli karty są różnego koloru, ale równa figura
				if(tmpInt[0] == 0)
				{
					//Zmniejszenie ilości identycznościowych kart
					tIdCards -= 1;
					
					
					//Spr czy dla karty I sa lepsze karty
					tmpVal = compateToOtherWithSameColor(new int[] {i, j}, srv);

					
					//Czy są lepsze karty od i-tej
					if(tmpVal[0] != 1)
					{
						
						//różnica miedzy następną
						diff = tmpVal[1];
						
						tmpVal = compateToOtherWithSameColor(new int[] {j, i}, srv);
						
						//Czy są lepsze karty od j-tej
						if(tmpVal[0] != 1)
						{
							//Czy następne karty są w tej samej odległości
							if(diff != tmpVal[1])
							{
								
								//Szukanie lepszej odległości (usuwamy kartę do której jest bliżej)
								if(diff == 0 || diff > tmpVal[1])
								{
									tmpCardsID[ j ] = null;
								}
								else
								{
									tmpCardsID[ i ] = null;
									
									//Korekcja pkt
									tPoints = (-srv.getCard( tmpCardsID[ i ] ).getFigure());
									
									continue;
								}
								
							}
							else
							{
								tmpCardsID[ j ] = null;
							}
							
							
						}
						else
						{
							tmpCardsID[ j ] = null;
						}
						
						
						
					}
					else
					{
						tmpCardsID[ i ] = null;
						
						//Korekcja pkt
						tPoints = (- srv.getCard( tmpCardsID[ i ] ).getFigure());
						
						continue;
					}
					
					
				}
				else if(tmpInt[1] == 0) //Ten Sam kolor, ale różne figury. (Determinacja likwidacji)
				{
					//Zmniejszenie ilości identycznościowych kart
					tIdCards -= 1;
					
					if(tmpInt[0] == 1) //i - card większa
					{
						tmpCardsID[ j ] = null;
 					}
					else //j - card większa
					{
						tmpCardsID[ i ] = null;
						
						//korekcja pkt
						tPoints = (-srv.getCard( tmpCardsID[ i ] ).getFigure());
						
						continue;
					}
				}
			}
		}
		
		
		
		points = tPoints;
		idCards = tIdCards;
		
		
		
	}
	
	
	/**
	 * Funkcja sprawdza którą kartę lepiej usunąć. (Dla różnych kolorów)
	 * 
	 * [0] - Karta cel z którą porównujemy.
	 * [1] - Karta która unikamy
	 * 
	 * Result:
	 * [0]
	 *  1 Większe 
	 *  0 Brak innych kart
	 * -1 Mniejsza
	 * 
	 * [1] występuje gdy nie ma większej karty (Zwraca ilość pkt karty za nią)
	 * 
	 * 
	 * @param indexCard
	 */
	private int[] compateToOtherWithSameColor(final int[] indexCard, Serwer srv)
	{
		//Definicja
		int opData[],
			tmpInt[];
		
		//Init.
		opData = new int[] {0, 0};
		
		for(int i = 0; i < size; i++)
		{
			if(i == indexCard[0] || i == indexCard[1] || srv.getCard( pCards[ indexCard[0] ] ).getColor() != srv.getCard( pCards[ indexCard[ i ] ] ).getColor())
			{
				continue;
			}
			
			//Porównanie
			tmpInt = srv.getCard( pCards[ indexCard[0] ] ).compareTo( srv.getCard( pCards[ i ] ));
			
			if(tmpInt[0] == 1)
			{
				opData[1] = 1;
				break;
			}
			else if(tmpInt[0] == -1)
			{
				opData[1] = -1;
				//Obliczamy różnicę
				opData[1] = srv.getCard( pCards[ i ] ).getFigure() - srv.getCard( pCards[ indexCard[0] ] ).getFigure();
			}
			
		}
		
		
		return opData;
		
	}

	
	
	/**
	 * Podmienia na określonej pozycji identyfikator karty
	 * 
	 * @param poz {Int[]} Pozycje kart
	 * @param obj {Integer[]} Identyfikatory kart
	 */
	public void updateDeck(final int poz, final Integer obj)
	{
		pCards[ poz ] = obj; 
	}
	
	
	
	
	
	//------------------ [gets & sets] - #START ------------------
	
	/**
	 * 
	 * Ustawia aktualną talie identyfikatór kart
	 * 
	 */
	public void setDeck(final Integer[] obj)
	{
		pCards = obj.clone();
	}
	
	/**
	 * Pobiera aktualną talię identyfikatorów kart.
	 * 
	 * @return
	 */
	public  Integer[] getDeck()
	{
		return pCards.clone();
	}
	
	
	/**
	 * Zwraca identyfikator karty na danej pozycji
	 * 
	 * @param pos
	 * @return
	 */
	public int getDeckElement(int pos)
	{
		return pCards[ pos ];
	}
	
	
	//------------------ [gets & sets] - #END ------------------
}
